package nextel.usuario;

import com.mot.iden.zip.ZipEntry;
import com.mot.iden.zip.ZipInputStream;
import nextel.usuario.mvc.MVCAyuda;
import nextel.visita.reporte.MVCReporte;
import pe.com.nextel.http.MensajeHttp;
import pe.com.nextel.http.XMLListener;
import pe.com.nextel.rms.DataInputStreamX;
import pe.com.nextel.rms.RecordStoreInputStream;
import pe.com.nextel.main.ControlBase;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.io.HttpConnection;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;
import nextel.Configuracion;
import nextel.dao.HttpControl;
import nextel.dao.XMLDAO;
import nextel.usuario.bean.GeneralBean;
import nextel.usuario.bean.ParametrosBean;
import nextel.usuario.bean.UsuarioBean;
import nextel.usuario.mvc.MVCMantenimiento;
import nextel.usuario.mvc.MVCMenu;
import nextel.usuario.mvc.MVCUsuario;
import nextel.usuario.rms.RMSGeneral;
import nextel.usuario.rms.RMSParametros;
import nextel.usuario.rms.RMSUsuario;
import nextel.visita.ControlVisita;
import nextel.ruta.ControlRuta;
import nextel.usuario.bean.AvanceBean;
import org.kxml2.io.KXmlParser;
import pe.com.nextel.idioma.IdiomaManager;
import pe.com.nextel.util.ArrayList;
import pe.com.nextel.util.Fecha;
import pe.com.nextel.util.HashMap;
import pe.com.nextel.util.List;

/**
 *
 * @author eespinoza
 */
public class ControlUsuario extends ControlBase {

    private static final ControlUsuario control = new ControlUsuario();
    public UsuarioBean currentUsuario;
    public ParametrosBean currentParametro;
    public AvanceBean currentAvance;
    //rms
    public final RMSUsuario rmsUsuario = new RMSUsuario();
    public final RMSParametros rmsParametros = new RMSParametros();
    public final RMSGeneral rmsGeneral = new RMSGeneral();
//    public final RMSRuta rmsRuta = new RMSRuta();
    //vistas
    public final MVCMantenimiento mvcMantenimiento = new MVCMantenimiento();
    public final MVCMenu mvcMenu = new MVCMenu();
    public final MVCAyuda mvcAyuda = new MVCAyuda();
    public final MVCUsuario mvcUsuario = new MVCUsuario();
    public final MVCReporte mvcReporte = new MVCReporte();
    //
    public HashMap hashGeneral;
    private XMLListener xmlListener;

    /**
     * metodo de acceso para instanciar los recordStored
     */
    public static ControlUsuario getInstance() {
        return control;
    }

    /**
     * para no crear mas instancias
     */
    private ControlUsuario() {
    }

    public void setXmlListener(XMLListener pxmlListener) {
        xmlListener = pxmlListener;
    }

    /*****************************************************************************/
    /********************LOGICA DE NEGOCIO **************************************/
    /*****************************************************************************/
    /*****************************************************************************/
    /******************** MANTENIMIENTO     **************************************/
    /*****************************************************************************/
    public void validarMantenimiento(String login, String password) {
        if (login.equals(Configuracion.USUARIO_MANT) && password.equals(Configuracion.PASSWORD_MANT)) {
            setCurrent(mvcMantenimiento);
        } else {
            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_USUARIO_PASS_INVALIDO), mvcUsuario.showScreen());
        }

    }

    public void grabarParametros(ParametrosBean parametro) {
        try {

            rmsParametros.guardarParametro(parametro);

            showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_REGISTRADO), ControlUsuario.getInstance().mvcUsuario.showScreen());

        } catch (Exception e) {
            showMensaje("Error" + e, mvcUsuario.showScreen());
        }
    }

    public ParametrosBean obtenerParametros() {
        try {
            return rmsParametros.obtenerParametro();
        } catch (Exception e) {
            showMensaje("Error" + e, mvcUsuario.showScreen());
        }
        return null;
    }

    /*****************************************************************************/
    /******************** USUARIO           **************************************/
    /*****************************************************************************/
    public void validarUsuario(String login, String password) {

        try {

            UsuarioBean usuario = rmsUsuario.getUsuario();
            usuario = usuario == null ? new UsuarioBean() : usuario;

            usuario.login = (login);
            usuario.password = (password);

            usuario.fechaMovil = Fecha.getFechaActualCompleta();

            currentUsuario = (usuario);

            getMensajeHttp().setUrl(Configuracion.URL_VALIDARINGRESO);
            getMensajeHttp().setMensaje(usuario.writeXML());

            System.out.println("url =" + Configuracion.URL_VALIDARINGRESO);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));
            // conectar al servidor            
            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_VALIDARUSUARIO);
            //System.out.println("1");
            iniciarConexionHTTP();
        //System.out.println("2");

        } catch (Exception e) {
//            e.printStackTrace();
            showError("Error : " + e, mvcUsuario.showScreen());

        }
    }

    public void procesarUsuarioOnLine(KXmlParser xml) {
        try {
            //System.out.println("Ingreso procesar online");
            UsuarioBean usuario = XMLDAO.getInstance().parseXMLUsuario(xml);
            //System.out.println("usuario= " + usuario);

            if (usuario != null) {

                usuario.login = currentUsuario.login;
                usuario.password = currentUsuario.password;
                usuario.idRecordRuta = currentUsuario.idRecordRuta;
                usuario.posicionRuta = currentUsuario.posicionRuta;
                usuario.cantidadVista = currentUsuario.cantidadVista;
                usuario.totalAtender = currentUsuario.totalAtender;
                //usuario.ultimoEstado = currentUsuario.ultimoEstado;
                if (usuario.codigo != null) {

                    currentUsuario = (usuario);
                    rmsUsuario.grabarUsuario(currentUsuario);
                    getAction().inicializarControlAction();
//                    System.out.println("***PROCESAR LOGEO 5***"+ "AVANCE = " +ControlUsuario.getInstance().currentUsuario.cantidadVista + "TOTAL = " + ControlUsuario.getInstance().currentUsuario.totalAtender );
                    showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_BIENVENIDO) + ": " + currentUsuario.nombres, mvcMenu.showScreen());
                } else {
                    showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_USUARIO_PASS_INVALIDO_CODIGO), mvcUsuario.showScreen());
                }
            } else {
                showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_USUARIO_PASS_INVALIDO), mvcUsuario.showScreen());
            }
        } catch (Exception e) {
            e.printStackTrace();
            showError(e.getMessage() + "", mvcUsuario.showScreen());
        }
    }

    /**
     * Cuando el equipo no tiene cobertura y valida con el �ltimo que ingreso <br>
     * al sistema
     * @param mensaje
     */
    public void procesarUsuarioOffLine(String mensaje) {
        try {

            UsuarioBean ultimo = rmsUsuario.getUsuario();

            if (ultimo != null) {
                if (!(currentUsuario.login.trim().equals(ultimo.login.trim())) ||
                        !(currentUsuario.password.trim().equals(ultimo.password.trim()))) {
                    ultimo = null;
                }
            }


            if (ultimo != null) {

                currentUsuario = (ultimo);
                getAction().inicializarControlAction();
                showMensaje(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NO_CONEXION_SERVIDOR) + mensaje, mvcMenu.showScreen());
            } else {
                showError("Login Error " + mensaje, mvcUsuario.showScreen());
            }
        } catch (Exception e) {
            e.printStackTrace();
            showError("Login Error" + e, mvcUsuario.showScreen());
        }
    }
    
    
        public void obtenerAvance() {

        try {
            
            currentAvance = new AvanceBean();
            currentAvance.setCodigoUsuario(currentUsuario.codigo);
            currentAvance.setFechaMovil(Fecha.getFechaActualCompleta());

            getMensajeHttp().setUrl(Configuracion.URL_AVANCE);
            getMensajeHttp().setMensaje(currentAvance.writeXML());

            System.out.println("url =" + Configuracion.URL_AVANCE);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));
            // conectar al servidor            
            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_AVANCE);
            //System.out.println("1");
            iniciarConexionHTTP();
        //System.out.println("2");

        } catch (Exception e) {
//            e.printStackTrace();
            showError("Error : " + e, mvcMenu.showScreen());

        }
    }   
        
        
     public void procesarAvanceOnLine(KXmlParser xml) {
        try {
            AvanceBean avance = XMLDAO.getInstance().parseXMLAvance(xml);

            if (avance != null) {
                
                currentAvance = new AvanceBean();
                currentAvance.setProgramado(avance.getProgramado());
                currentAvance.setRealizado(avance.getRealizado());
                
//                System.out.println("prog " + currentAvance.getProgramado());
//                System.out.println("real " + currentAvance.getRealizado());
                
                setCurrent(mvcReporte);
                
            } else {
                showError(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_NO_ATENDER_SERVICIO), mvcMenu.showScreen());
            }
        } catch (Exception e) {
            e.printStackTrace();
            showError(e.getMessage() + "", mvcMenu.showScreen());
        }
     }    

    /**
     * Cuando sucede un error en la comunicacion del equipo al servidor
     * @param mensaje
     */
    public void comunicacionOffLine(String mensaje) {

        showMensaje(mensaje, mvcMenu.showScreen());

    }

    /*****************************************************************************/
    /******************** GENERAL           **************************************/
    /*****************************************************************************/
    public List getListGeneral(String codigoGrupo) {
        if (hashGeneral != null) {
            Object object = hashGeneral.get(codigoGrupo);
            if (object != null) {
                return (List) object;
            }
        }
        return new ArrayList();
    }

    public GeneralBean getGeneral(String codigoGrupo, String codigoItem) {
        //   System.out.println("getGeneral"+codigoGrupo);

        List lista = getListGeneral(codigoGrupo);
        //System.out.println("lista.size=="+lista.size());
        for (int i = 0; i < lista.size(); i++) {
            GeneralBean bean = (GeneralBean) lista.get(i);
            //   System.out.println("bean.getCodigo=" + bean.getCodigo());
            //    System.out.println("bean.getValor="+bean.getValor());
            if (codigoItem.equals(bean.getCodigo())) {
                return bean;
            }
        }

        return null;
    }

    /**
     * obtiene la lista de codigos de clientes
     */
    public void getHashListaGeneral() throws Exception {

        List lista = rmsGeneral.getAllLista();
        hashGeneral = new HashMap();

        if (lista != null) {

            String identificador = "";

            List listaParcialAgrupado = null;

            for (int i = 0; i < lista.size(); i++) {

                if (i == 0) {
                    identificador = ((GeneralBean) lista.get(0)).getGrupo();

                    listaParcialAgrupado = new ArrayList();
                }

                if (identificador.equals(((GeneralBean) lista.get(i)).getGrupo())) {
                    listaParcialAgrupado.add(lista.get(i));
                } else {

                    hashGeneral.put(identificador, listaParcialAgrupado);

                    listaParcialAgrupado = new ArrayList();
                    listaParcialAgrupado.add(lista.get(i));
                    identificador = ((GeneralBean) lista.get(i)).getGrupo();

                }

                if (i + 1 == lista.size()) {
                    hashGeneral.put(identificador, listaParcialAgrupado);

                }
            }

        }

    }

    /*****************************************************************************/
    /******************** SINCRONIZAR        **************************************/
    /*****************************************************************************/
    public void eliminarDatos() throws Exception {
        rmsGeneral.deleteAll();
    }

    public void eliminarTODOS() throws Exception {

        ControlUsuario.getInstance().eliminarDatos();

//        if(Configuracion.ACTIVO.equals(ControlUsuario.getInstance().currentUsuario.ruta)){
        ControlRuta.getInstance().eliminarDatos();
//        }else{
//            ControlUsuario.getInstance().rmsRuta.deleteAll();
//        }

        ControlVisita.getInstance().eliminarDatos();

    }

    public String getCantidadSincronizada() throws Exception {

        StringBuffer str = new StringBuffer();

//        if(Configuracion.ACTIVO.equals(ControlUsuario.getInstance().currentUsuario.ruta)){

        currentUsuario.totalAtender = ControlRuta.getInstance().rmsRuta.cantidadObjectLista(Configuracion.RMS_CANTREG);

        str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_RUTA) + ": ").append(currentUsuario.totalAtender).append(' ');

//        } else {

//            RutaBean ruta = ControlUsuario.getInstance().rmsRuta.obtenerPrimeraRuta( );
//
//            if(ruta != null){
//                str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ESTADO)+": ").append(ruta.lstEstados.size( )).append(' ');
//            }else{
//                str.append( IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ESTADO)+ ": 0 ").append(' ');
//            }
//        }

        rmsUsuario.grabarUsuario(currentUsuario);

        str.append(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_GENERAL) + ": ").append(ControlUsuario.getInstance().rmsGeneral.cantidadObject()).append(" Gp").append('\n');

        return str.toString();
    }

    public void sincronizar() {

        try {

            currentUsuario.fechaMovil = Fecha.getFechaActualCompleta();

            getMensajeHttp().setMensaje(currentUsuario.writeXML());

            getMensajeHttp().setTipoEnvio(HttpConnection.POST);

            getMensajeHttp().setUrl(Configuracion.URL_SINCRONIZAR);

            HttpControl.getInstance().setProceso(HttpControl.getInstance().PRCHTTP_SINCRONIZAR);

            System.out.println("url =" + Configuracion.URL_SINCRONIZAR);
            System.out.println("mensaje =" + new String(getMensajeHttp().getMensaje()));


        } catch (Exception ex) {
            ex.printStackTrace();
            showMensaje("Error " + ex, mvcMenu.showScreen());
        }
    }

    public void procesarSincronizar(MensajeHttp mensajeHttp) {
//        System.out.println("procesarSincronizar");
        try {

            limpiarMemoria();


            eliminarTODOS();

            //limpiamos el usuario de memoria y en el rms la ultima actividad
            // currentUsuario.idRecordRuta = 0;
            if (!Fecha.esIgualDDMMYYYY(currentUsuario.fechaRuta, Fecha.getDate().getTime())) {

                currentUsuario.cantidadNoVisita = 0;
                currentUsuario.cantidadVista = 0;
                currentUsuario.fechaRuta = Fecha.getDate().getTime();
                currentUsuario.idRecordRuta = 0;
                currentUsuario.posicionRuta = 0;

            }

            rmsUsuario.grabarUsuario(currentUsuario);

            procesarSincronizarData(mensajeHttp);

            processDownloadedData();

            //obtenemos la cantidad sincronizada
            showMensaje(getCantidadSincronizada(), ControlUsuario.getInstance().mvcMenu.showScreen());

            System.gc();

        } catch (Exception e) {
            e.printStackTrace();
            showError(e + "", mvcMenu.showScreen());
        }
    }

    public void procesarSincronizarData(MensajeHttp mensajeHttp) throws Exception {
        //#debug
//        System.out.println("data.procesarSincronizar");

        InputStream input = mensajeHttp.getInput();

        xmlListener.print(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_ESPERE_PORFAVOR) + "...");

        byte[] bufferData = new byte[5120]; //10240 //5120

        int amountData = 0;
        try {
            RecordStore.deleteRecordStore("RS_DOWNLOAD_TMP");
        } catch (RecordStoreException ex) {
//            System.out.println("not found " + ex.getMessage());
        }

        RecordStore rs = null;

        try {

            rs = RecordStore.openRecordStore("RS_DOWNLOAD_TMP", true);

            while ((amountData = input.read(bufferData)) != -1) {

                rs.addRecord(bufferData, 0, amountData);
            }



        } catch (RecordStoreException ex) {
            //   ex.printStackTrace();
            throw ex;
        } catch (IOException ex) {
            //  ex.printStackTrace();
            throw ex;

        } finally {
            try {
                if (rs != null) {
                    rs.closeRecordStore();
                    rs = null;
                }
                bufferData = null;
            } catch (Exception ex) {
                //  System.out.println("final de error = " + ex.getMessage());
            }
        }

    }

    public void processDownloadedData() throws Exception {
        RecordStore rs = null;
        InputStream input = null;
        try {

            rs = RecordStore.openRecordStore("RS_DOWNLOAD_TMP", true);
            input = new RecordStoreInputStream(rs);
            guardarTablas(input);

        } catch (Exception ex) {
            throw ex;
        } finally {
            try {
                if (rs != null) {
                    rs.closeRecordStore();
                    rs = null;
                }
                if (input != null) {
                    input.close();
                    input = null;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                RecordStore.deleteRecordStore("RS_DOWNLOAD_TMP");
            } catch (RecordStoreException e) {
                e.printStackTrace();
            }
        }
    }

    public void guardarTablas(InputStream input) throws Exception {

        ZipInputStream zipInput = new ZipInputStream(input);
        ZipEntry ze = zipInput.getNextEntry();

        DataInputStreamX dataInput = new DataInputStreamX(zipInput);

        String recordStoreName;
        int recordStoreSize;

        RecordStore rs = null;

        try {

            while (true) {

                recordStoreName = dataInput.readString();
                recordStoreSize = dataInput.readInt();

                System.out.println("recordStoreName=" + recordStoreName + "|");
                xmlListener.print(recordStoreName + " size=" + recordStoreSize);

                rs = RecordStore.openRecordStore(recordStoreName, true);
                saveRecordStore(dataInput, recordStoreSize, rs);

                System.out.println("\t-> RS records: " + rs.getNumRecords());

                rs.closeRecordStore();
                rs = null;

                System.gc();
            }

        } catch (Exception ex) {
            System.out.println(IdiomaManager.getInstance().getMensaje(IdiomaManager.JAVA_DATA_COMPLETA) + ": " + ex);

        } finally {
            if (rs != null) {
                rs.closeRecordStore();
            }
        }


        zipInput.closeEntry();

        zipInput.close();

        zipInput = null;

    }

    public void saveRecordStore(DataInputStreamX input, int size, RecordStore rs) throws Exception {
//        System.out.println("saveRecordStore= " + size);
        byte[] buffer = null;
        int dataReaded = 0;
        int bufferSize = 0;

        buffer = new byte[100000];

        while (dataReaded < size) {

            bufferSize = input.readInt();

            input.readFully(buffer, 0, bufferSize);

            rs.addRecord(buffer, 0, bufferSize);

            dataReaded = dataReaded + bufferSize;
            dataReaded += 4;


        }
        buffer = null;

        System.gc();

    }

    public void limpiarMemoria() {

        ControlVisita.getInstance().limpiarMemoria();

        if (hashGeneral != null) {
            hashGeneral.clear();
            hashGeneral = null;
        }

//       if(Configuracion.ACTIVO.equals(ControlUsuario.getInstance().currentUsuario.ruta)){
        ControlRuta.getInstance().limpiarMemoria();
//       }


        ControlVisita.getInstance().currentEstado = null;

        System.gc();
    }
}
